package com.shawn.test;
class Shared{
	private int refcount = 0;
	private static long counter=0;
	private final long id = counter++;
	public Shared(){
		System.out.println("Creating"+this);//this指代什么？this=shared0
	}
	public void addRef(){refcount++;}
	protected void dispose(){
		if(--refcount ==0)
			System.out.println("Disposing"+this);//this=shared0
	}
	public String toString() {return "Shared"+id;}
}
class Composing{
	private Shared shared;
	private static long counter=0;
	private final long id =counter++;
	public Composing(Shared shared){
		System.out.println("Creating"+this);//this=Composing0
		this.shared=shared;
		this.shared.addRef();
	}
	protected void dispose(){
		System.out.println("disposing"+this);//this=Composing0
		shared.dispose();
	}
	public String toString(){return "Composing"+id;}
}
public class ReferenceCounting {
	public static void main(String[] args) {
		Shared shared = new Shared();
		Composing[] composing = {new Composing(shared),new Composing(shared),
				new Composing(shared),new Composing(shared),new Composing(shared)};
		for(Composing c:composing)
			c.dispose();
	}

}
